/**
 * 批改错误处理工具
 * 提供统一的错误消息和恢复建议
 */

/**
 * 错误类型常量
 */
export const ERROR_TYPES = {
  ESSAY_NOT_FOUND: 'ESSAY_NOT_FOUND',
  NOT_YET_CORRECTED: 'NOT_YET_CORRECTED',
  CORRECTION_IN_PROGRESS: 'CORRECTION_IN_PROGRESS',
  CORRECTION_FAILED: 'CORRECTION_FAILED',
  NETWORK_ERROR: 'NETWORK_ERROR',
  INVALID_DATA: 'INVALID_DATA',
  UNKNOWN: 'UNKNOWN',
};

/**
 * 错误消息配置
 */
const ERROR_MESSAGES = {
  [ERROR_TYPES.ESSAY_NOT_FOUND]: {
    title: '作文不存在',
    message: '该作文可能已被删除或您没有访问权限',
    suggestions: [
      '检查作文ID是否正确',
      '返回历史记录页查看其他作文',
      '联系管理员获取帮助',
    ],
    action: '返回历史记录',
    actionRoute: '/history',
  },
  [ERROR_TYPES.NOT_YET_CORRECTED]: {
    title: '作文尚未批改',
    message: '该作文还没有批改结果，需要先提交批改',
    suggestions: [
      '点击下方按钮提交批改',
      '批改通常需要30-60秒完成',
      '完成后会自动显示结果',
    ],
    action: '开始批改',
    actionType: 'submit',
  },
  [ERROR_TYPES.CORRECTION_IN_PROGRESS]: {
    title: 'AI正在批改中',
    message: '您的作文正在被AI老师认真批改，请稍候...',
    suggestions: [
      '批改通常需要30-60秒',
      '页面会自动刷新显示结果',
      '请不要关闭页面',
    ],
    action: '等待中',
    actionType: 'wait',
  },
  [ERROR_TYPES.CORRECTION_FAILED]: {
    title: '批改失败',
    message: '批改过程中出现错误，请重新提交',
    suggestions: [
      '点击"重新批改"按钮重试',
      '如果问题持续，请稍后再试',
      '联系技术支持获取帮助',
    ],
    action: '重新批改',
    actionType: 'retry',
  },
  [ERROR_TYPES.NETWORK_ERROR]: {
    title: '网络连接失败',
    message: '无法连接到服务器，请检查网络连接',
    suggestions: [
      '检查网络连接是否正常',
      '尝试刷新页面',
      '稍后再试',
    ],
    action: '重新加载',
    actionType: 'reload',
  },
  [ERROR_TYPES.INVALID_DATA]: {
    title: '数据格式错误',
    message: '服务器返回的数据格式不正确',
    suggestions: [
      '尝试刷新页面',
      '清除浏览器缓存',
      '如果问题持续，请联系技术支持',
    ],
    action: '刷新页面',
    actionType: 'reload',
  },
  [ERROR_TYPES.UNKNOWN]: {
    title: '未知错误',
    message: '发生了意外错误，请重试',
    suggestions: [
      '尝试刷新页面',
      '稍后再试',
      '如果问题持续，请联系技术支持',
    ],
    action: '重试',
    actionType: 'retry',
  },
};

/**
 * 根据错误对象识别错误类型
 * @param {Error|Object} error - 错误对象
 * @returns {string} 错误类型
 */
export function identifyErrorType(error) {
  if (!error) return ERROR_TYPES.UNKNOWN;

  // 检查错误类型字段
  if (error.type) {
    switch (error.type) {
      case 'NOT_FOUND':
      case 'ESSAY_NOT_FOUND':
        return ERROR_TYPES.ESSAY_NOT_FOUND;
      case 'PROCESSING':
        return ERROR_TYPES.CORRECTION_IN_PROGRESS;
      case 'NETWORK_ERROR':
        return ERROR_TYPES.NETWORK_ERROR;
      case 'INVALID_DATA':
        return ERROR_TYPES.INVALID_DATA;
      default:
        break;
    }
  }

  // 检查HTTP状态码
  if (error.status === 404) {
    return ERROR_TYPES.ESSAY_NOT_FOUND;
  }

  // 检查错误消息
  const message = error.message?.toLowerCase() || '';
  if (message.includes('不存在') || message.includes('not found')) {
    return ERROR_TYPES.ESSAY_NOT_FOUND;
  }
  if (message.includes('尚未批改') || message.includes('not corrected')) {
    return ERROR_TYPES.NOT_YET_CORRECTED;
  }
  if (message.includes('批改中') || message.includes('processing')) {
    return ERROR_TYPES.CORRECTION_IN_PROGRESS;
  }
  if (message.includes('批改失败') || message.includes('failed')) {
    return ERROR_TYPES.CORRECTION_FAILED;
  }
  if (message.includes('网络') || message.includes('network')) {
    return ERROR_TYPES.NETWORK_ERROR;
  }
  if (message.includes('格式') || message.includes('invalid')) {
    return ERROR_TYPES.INVALID_DATA;
  }

  return ERROR_TYPES.UNKNOWN;
}

/**
 * 获取友好的错误消息
 * @param {Error|Object} error - 错误对象
 * @returns {Object} 错误消息配置
 */
export function getCorrectionErrorMessage(error) {
  const errorType = identifyErrorType(error);
  const config = ERROR_MESSAGES[errorType] || ERROR_MESSAGES[ERROR_TYPES.UNKNOWN];

  return {
    type: errorType,
    ...config,
    originalError: error,
  };
}

/**
 * 判断错误是否可以重试
 * @param {Error|Object} error - 错误对象
 * @returns {boolean} 是否可以重试
 */
export function isRetryableError(error) {
  const errorType = identifyErrorType(error);
  return [
    ERROR_TYPES.CORRECTION_IN_PROGRESS,
    ERROR_TYPES.NETWORK_ERROR,
    ERROR_TYPES.UNKNOWN,
  ].includes(errorType);
}

/**
 * 判断错误是否应该自动重试
 * @param {Error|Object} error - 错误对象
 * @returns {boolean} 是否应该自动重试
 */
export function shouldAutoRetry(error) {
  const errorType = identifyErrorType(error);
  return [
    ERROR_TYPES.CORRECTION_IN_PROGRESS,
    ERROR_TYPES.NETWORK_ERROR,
  ].includes(errorType);
}

export default {
  ERROR_TYPES,
  identifyErrorType,
  getCorrectionErrorMessage,
  isRetryableError,
  shouldAutoRetry,
};

